Системное программирование

POSIX

Системное программирование

POSIX (Portable Operating System Interface) — это набор стандартов, разработанных для обеспечения совместимости между различными UNIX-подобными операционными системами. POSIX определяет API (интерфейсы программирования приложений) для работы с файловой системой, процессами, потоками, сетевыми взаимодействиями и другими аспектами операционной системы. Эти стандарты позволяют писать переносимый код, который может работать на разных UNIX-системах, включая Linux, macOS и BSD.

POSIX
Системное программирование

Основные аспекты POSIX

1. Стандарты POSIX

  • POSIX.1: Базовый стандарт, определяющий API для работы с файлами, процессами, сигналами и потоками.
  • POSIX.2: Стандарт для утилит командной строки (например, grep, awk, sed).
  • POSIX.4: Расширения для реального времени (real-time).
  • POSIX.7: Системное администрирование.
POSIX
Системное программирование

2. Основные компоненты POSIX

a) Файловая система

  • Функции для работы с файлами: open(), read(), write(), close().
  • Управление правами доступа: chmod(), chown().
  • Работа с каталогами: opendir(), readdir(), closedir().
POSIX
Системное программирование

Пример:

#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd = open("example.txt", O_RDWR | O_CREAT, 0644);
    write(fd, "Hello, POSIX!", 13);
    close(fd);
    return 0;
}
POSIX
Системное программирование

b) Процессы

  • Создание процессов: fork(), exec().
  • Управление процессами: wait(), exit(), kill().
  • Сигналы: signal(), sigaction().
POSIX
Системное программирование

Пример:

#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // Дочерний процесс
        execlp("ls", "ls", NULL);
    } else {
        // Родительский процесс
        wait(NULL);
    }
    return 0;
}
POSIX
Системное программирование

c) Потоки (Threads)

  • Создание потоков: pthread_create().
  • Синхронизация: мьютексы (pthread_mutex_t), условные переменные (pthread_cond_t).
POSIX
Системное программирование

Пример:

#include <pthread.h>
#include <stdio.h>

void* thread_func(void* arg) {
    printf("Hello from thread!\n");
    return NULL;
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, thread_func, NULL);
    pthread_join(thread, NULL);
    return 0;
}
POSIX
Системное программирование

d) Межпроцессное взаимодействие (IPC)

  • Каналы (pipes): pipe().
  • Очереди сообщений: msgget(), msgsnd(), msgrcv().
  • Разделяемая память: shmget(), shmat().
  • Семафоры: semget(), semop().
POSIX
Системное программирование

Пример использования каналов:

#include <unistd.h>
#include <stdio.h>

int main() {
    int fd[2];
    pipe(fd);

    if (fork() == 0) {
        // Дочерний процесс
        close(fd[0]); // Закрываем чтение
        write(fd[1], "Hello", 6);
        close(fd[1]);
    } else {
        // Родительский процесс
        close(fd[1]); // Закрываем запись
        char buffer[10];
        read(fd[0], buffer, sizeof(buffer));
        printf("Received: %s\n", buffer);
        close(fd[0]);
    }
    return 0;
}
POSIX
Системное программирование

e) Сетевые взаимодействия

  • Сокеты: socket(), bind(), listen(), accept(), connect().
POSIX
Системное программирование
  • Пример TCP-сервера:
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main() {
        int server_socket = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in server_addr = {
            .sin_family = AF_INET,
            .sin_port = htons(8080),
            .sin_addr.s_addr = INADDR_ANY
        };
    
        bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
        listen(server_socket, 5);
    
        int client_socket = accept(server_socket, NULL, NULL);
        char buffer[1024];
        read(client_socket, buffer, sizeof(buffer));
        printf("Received: %s\n", buffer);
        close(client_socket);
        close(server_socket);
        return 0;
    }
    
POSIX
Системное программирование

3. Преимущества POSIX

  • Переносимость: Код, написанный с использованием POSIX, может работать на разных UNIX-подобных системах.
  • Стандартизация: Упрощает разработку и поддержку кода.
  • Широкая поддержка: Большинство современных ОС (Linux, macOS, BSD) поддерживают POSIX.
POSIX
Системное программирование

4. Проверка совместимости с POSIX

  • В Linux можно использовать макрос _POSIX_VERSION для проверки поддержки стандарта:
    #include <unistd.h>
    #include <stdio.h>
    
    int main() {
        #ifdef _POSIX_VERSION
            printf("POSIX version: %ld\n", _POSIX_VERSION);
        #else
            printf("POSIX not supported\n");
        #endif
        return 0;
    }
    
POSIX
Системное программирование

5. Инструменты для работы с POSIX

  • Компиляторы: GCC, Clang.
  • Библиотеки: Glibc (реализация POSIX в Linux).
  • Утилиты: grep, awk, sed, make.
POSIX